/**
	2011/12/18 satmat
	https://twitter.com/satellitesat
	winter.daydreams@gmail.com
*/



/**
	各種設定
*/
var njkBaseUrl = 'http://jk.nicovideo.jp';		/*ニコニコ実況のベースアドレス*/

var epg2chToNjkMap = {
	"4e484bc1edb9e7": "jk1",  			// NHK総合
	"4e484bb6b5b0e9": "jk2", 			// Eテレ
	"c6fccbdca5c6a5eca5d3": "jk4", 	// 日本テレビ
	"a5c6a5eca5d3c4abc6fc": "jk5", 	//  テレ朝
	"544253a5c6a5eca5d3": "jk6",		// TBS
	"a5c6a5eca5d3c5ecb5fe": "jk7",	// テレ東
	"a5d5a5b8a5c6a5eca5d3": "jk8" 	// フジテレビ
};


/**
	iEPGのURLから番組開始時刻を取得する
	yyyyMMddhhmm.tvpi
*/
function getStarttimeFromIepgUrl(iepgurl){
	var timeStr = iepgurl.substring(iepgurl.length - 17 , iepgurl.length - 5);
	var timeDate = new Date(
		parseInt(timeStr.substring(0,4), 10), 			//yyyy
		parseInt(timeStr.substring(4,6), 10) - 1, 		//MM ( 0-11 )
		parseInt(timeStr.substring(6,8), 10), 			//dd
		parseInt(timeStr.substring(8,10), 10), 			//hh
		parseInt(timeStr.substring(10,12), 10),			//mm
		0																	// ss
	);
	return timeDate;
}


/**
	iEPGのURLから実況放送局番号(jk1,jk2など）に変換する
*/
function getJkStationFromIepgUrl(iepgurl){
	var lastSlash = iepgurl.lastIndexOf('/');
	var stationStr = iepgurl.substring(lastSlash+1, iepgurl.length-17);
	var jkstr = epg2chToNjkMap[stationStr];	
	return jkstr;
}


/**
	番組開始時刻とjk番号から、ニコニコ実況アクセス用のURLを作る
*/
function getNjkUrlFromStarttimeAndJkStation(starttime, jk){
	var nowdate = new Date();
	var njkUrl = "";
		
	if(starttime.getTime() < nowdate.getTime()){		// 過去番組
		var endtime = new Date();
		endtime.setTime(starttime.getTime() + 1800*1000);	// 30分=1800秒加算
				
		njkUrl = njkBaseUrl + "/log/" + jk + "/" + 
			starttime.getFullYear().toString() + 
			toTwoDigits(starttime.getMonth()+1) +
			toTwoDigits(starttime.getDate()) +
			toTwoDigits(starttime.getHours()) +
			toTwoDigits(starttime.getMinutes()) +
			"00-" +
			endtime.getFullYear().toString() + 
			toTwoDigits(endtime.getMonth()+1) +
			toTwoDigits(endtime.getDate()) +
			toTwoDigits(endtime.getHours()) +
			toTwoDigits(endtime.getMinutes()) +
			"00";
	}else{																						// 現在番組
		njkUrl = njkBaseUrl + "/watch/" + jk;
	}
	
		return njkUrl;
}


/**
	数値nを2桁の文字列にする。
	1		→		01
	12		→		12
*/
function toTwoDigits(n){
	if(n<10){ 
		return ("0" + n.toString());
	}else{
		return n.toString();
	}
}


/**
	iEPGのURLからニコニコ実況過去ログのURL文字列を作る
*/
function createNjkUrlStrFromIepgUrl(iepgUrl){
	var startTime = getStarttimeFromIepgUrl(iepgUrl);
	var jkStr = getJkStationFromIepgUrl(iepgUrl);
	var njkUrl = getNjkUrlFromStarttimeAndJkStation(startTime, jkStr);
	return njkUrl;
}


/**
iEPGのURLからニコニコ実況過去ログへのリンク(a要素)を作る
*/
function createNjkLinkElemFromIepgUrl(iepgUrl){
	var nja = document.createElement("a");
	nja.href = createNjkUrlStrFromIepgUrl(iepgUrl);
	nja.target = "_blank";
	
	var njimg = document.createElement("img");
	njimg.src = "http://jk.nicovideo.jp/images/nico.ico";
	njimg.style = "width:12px; height:12px;";

	var njatext = document.createTextNode(" [ニコニコ実況で表示]");

	nja.appendChild(njimg);
	nja.appendChild(njatext);

	return nja;
}


/**
	番組セルにマウスオーバーしたら	、ニコニコ実況へのリンクを表示するための
	マウスオーバーイベントハンドラ
	e.targetはtd自体だけでなく、マウスオーバーしたtd内の要素もあり得る。
*/
function visibleNjkLink(e){
	if(e.target.nodeName.toLowerCase() == "td" &&
		e.target.lastChild &&
		e.target.lastChild.href &&
		e.target.lastChild.href.search(njkBaseUrl) == -1){
		var links = e.target.getElementsByTagName("a");
		var nja = null;
		
		for(i=0; i<links.length; i++){
			if(links[i].href && links[i].href.match(/.tvpi$/i)){
				nja = createNjkLinkElemFromIepgUrl(links[i].href);
			}	
		}
		e.target.appendChild(document.createElement("br"));
		e.target.appendChild(nja);
	}
}


/**
	番組セルからマウスアウトしたら	、ニコニコ実況へのリンクを削除するための
	マウスアウトイベントハンドラ
*/
function hiddenNjkLink(e){
	var fromTd = null;
	var toTd = null;
	
	if(e.target && e.target.nodeName){
		if(e.target.nodeName.toLowerCase()=="a"){
			if(e.target.parentNode && e.target.parentNode.nodeName.toLowerCase()=="td"){
				fromTd = e.target.parentNode;
			}
		}else if(e.target.nodeName.toLowerCase()=="img"){
			if(e.target.parentNode && e.target.parentNode.nodeName.toLowerCase()=="td"){
				fromTd = e.target.parentNode;
			}else if(e.target.parentNode.parentNode && e.target.parentNode.parentNode.nodeName &&
						e.target.parentNode.parentNode.nodeName.toLowerCase() == "td"){
				fromTd = e.target.parentNode.parentNode;
			}
		}else if(e.target.nodeName.toLowerCase()=="td"){
			fromTd = e.target;
		}
	}

	if(e.relatedTarget && e.relatedTarget.nodeName){
		if(e.relatedTarget.nodeName.toLowerCase()=="a"){
			if(e.relatedTarget.parentNode && e.relatedTarget.parentNode.nodeName.toLowerCase()=="td"){
				toTd = e.relatedTarget.parentNode;
			}
		}else if(e.relatedTarget.nodeName.toLowerCase()=="img"){
			if(e.relatedTarget.parentNode && e.relatedTarget.parentNode.nodeName.toLowerCase()=="td"){
				toTd = e.relatedTarget.parentNode;
			}else if(e.relatedTarget.parentNode.parentNode && 
						e.relatedTarget.parentNode.parentNode.nodeName &&
						e.relatedTarget.parentNode.parentNode.nodeName.toLowerCase() == "td"){
				toTd = e.relatedTarget.parentNode.parentNode;
			}
		}else if(e.relatedTarget.nodeName.toLowerCase()=="td"){
			toTd = e.relatedTarget;
		}
	}
	
	if(fromTd && toTd && fromTd == toTd){
		// 同じセル内への移動であれば何もしない
	}else{
		if(fromTd && fromTd.lastChild && fromTd.lastChild.href &&
			fromTd.lastChild.href.search(njkBaseUrl) != -1){
				fromTd.removeChild(fromTd.lastChild); // ニコニコ実況へのリンク
				fromTd.removeChild(fromTd.lastChild); // br
		}
	}
}


/**
	2ch番組表での初期処理
*/
function initializeOnEpg2ch(){
	if(document.title.match(/.+\d{12}.+/)){ // 番組詳細ページでの処理
		var bodydiv = document.getElementById("body");
		var links = bodydiv.getElementsByTagName("a");
		for(var i=0; i<links.length; i++){
			var atrbhref = links[i].getAttribute("href");
			if(atrbhref != null && atrbhref.match(/.tvpi$/i)){
				var nja = createNjkLinkElemFromIepgUrl(atrbhref);
				var br = document.createElement("br");
				links[i].parentNode.appendChild(br);
				links[i].parentNode.appendChild(nja);
			}
		}
	}else{ // 番組欄ページでの処理
		var tables = document.getElementsByTagName("table");
		for(var i=0; i<tables.length; i++){
			var cap = tables[i].getElementsByTagName("caption");
			if(cap.length>0 && cap[0].innerText.match(/^\d{4}\/\d{2}\/\d{2}\(.\)/)){
				var links = tables[i].getElementsByTagName("a");
				for(var i=0; i<links.length; i++){
					var atrbhref = links[i].getAttribute("href");
					if(atrbhref != null && atrbhref.match(/.tvpi$/i)){
						links[i].parentNode.onmouseover = visibleNjkLink;
						links[i].parentNode.onmouseout = hiddenNjkLink;					
					}
				}
			}
		} 
	}
}
